home *** CD-ROM | disk | FTP | other *** search
- (*===========================================================================*)
- (* Clean up message routing *)
- (* *)
- (* Copyright 1990, 1991, 1992 by H. Roy Engehausen. All rights reserved. *)
- (* *)
- (*===========================================================================*)
-
- {$O+}
-
- {$DEFINE POINT_CHK}
- {$DEFINE FREE_CHK}
-
- UNIT BBFWDC;
-
- INTERFACE
-
- USES
- bbdummy,
- bbfwdd;
-
- PROCEDURE fwd_route_clean_msg(this_msg : msg_index_ptr);
-
- PROCEDURE fwd_route_mark_done(path_data : path_block_ptr);
-
- PROCEDURE fwd_route_clean_empty_route;
-
- PROCEDURE fwd_route_reset(this_blk : msg_r_ptr);
-
- IMPLEMENTATION
-
- USES
- bbbpa,
- bbdump,
- bbfnr,
- bbmem,
- bbmf,
- bbmisc3,
- bbstr;
-
- (*===========================================================================*)
- (* Clean up forward pointers in a message *)
- (*===========================================================================*)
-
- PROCEDURE fwd_route_clean_msg(this_msg : msg_index_ptr);
-
- VAR
- i : WORD;
- num_dis : BYTE;
- this_dr : msg_dr_ptr;
- this_flag : msg_flag_type;
-
- {$UNDEF DEBUG_1}
- {$UNDEF DEBUG_2}
-
- BEGIN;
-
- {$IFDEF POINT_CHK}
- test_pointer(this_msg);
- {$ENDIF}
-
- (*-----------------------------------------------------------------------*)
- (* Get the flag to be handy *)
- (*-----------------------------------------------------------------------*)
-
- this_flag := this_msg^.msg_i_mb.msg_flag;
-
- (*-----------------------------------------------------------------------*)
- (* If no distribution list then just remove pointer else lots of work *)
- (*-----------------------------------------------------------------------*)
-
- IF (this_flag AND mf_fwd_list) = 0 THEN
- this_msg^.msg_i_rou := NIL
- ELSE
- BEGIN;
-
- (*-------------------------------------------------------------------*)
- (* If the distrbution route block is present then we erase it and *)
- (* clean up chaining. *)
- (*-------------------------------------------------------------------*)
-
- IF (this_flag AND mf_disrout) <> 0 THEN
- BEGIN;
-
- {$IFDEF DEBUG_2}
- WRITELN('DR block clean -- ', this_msg^.msg_i_mb.msg_number);
- {$ENDIF}
-
- this_dr := this_msg^.msg_i_dr;
-
- {$IFDEF POINT_CHK}
- test_pointer(this_dr);
- test_pointer(this_dr^.msg_dr_dblk);
- {$ENDIF}
-
- this_msg^.msg_i_dis := this_dr^.msg_dr_dblk;
- num_dis := this_msg^.msg_i_dis^.msg_d_no;
-
- IF num_dis > msg_dist_max THEN
- BEGIN;
- dump_reason('FWDC1 Invalid distribution # -- ' + w2c(num_dis));
- dump_reason('M # = ' + w2c(this_msg^.msg_i_mb.msg_number));
- dump_all;
- HALT;
- END;
-
- FREEMEM(this_dr, SIZEOF(msg_d_ptr)
- + WORD(num_dis) * SIZEOF(msg_dr_route_item));
-
- {$IFDEF FREE_CHECK}
- test_free_list;
- {$ENDIF}
-
- END;
-
- (*-------------------------------------------------------------------*)
- (* If the distrbution block is present then we erase it *)
- (*-------------------------------------------------------------------*)
-
- IF this_msg^.msg_i_dis <> NIL THEN
- BEGIN;
-
- {$IFDEF POINT_CHK}
- test_pointer(this_msg^.msg_i_dis);
- {$ENDIF}
-
- num_dis := this_msg^.msg_i_dis^.msg_d_no;
- i := 1 + WORD(num_dis) * SIZEOF(msg_dist_entry_type);
-
- IF num_dis > msg_dist_max THEN
- BEGIN;
- dump_reason('FWDC2 Invalid distribution # -- ' + w2c(num_dis));
- dump_reason('M # = ' + w2c(this_msg^.msg_i_mb.msg_number));
- dump_all;
- HALT;
- END;
-
- {$IFDEF DEBUG_2}
- WRITELN('D block clean -- ', this_msg^.msg_i_mb.msg_number,
- ' -- ', num_dis);
- {$ENDIF}
-
- FREEMEM(this_msg^.msg_i_dis, i);
- this_msg^.msg_i_dis := NIL;
-
- {$IFDEF FREE_CHECK}
- test_free_list;
- {$ENDIF}
-
- END;
-
- END;
-
- (*-----------------------------------------------------------------------*)
- (* Remove certain flags *)
- (*-----------------------------------------------------------------------*)
-
- this_msg^.msg_i_mb.msg_flag := this_flag
- AND NOT (mf_fwd_select OR mf_fwd_process
- OR mf_disrout OR mf_unknown);
-
- END;
-
- (*===========================================================================*)
- (* Mark all routes as used *)
- (*===========================================================================*)
-
- PROCEDURE fwd_route_mark_done(path_data : path_block_ptr);
-
- VAR
- bpa_route : bpa_route_used_type;
- this_blk : msg_r_ptr;
-
- LABEL
- start_here;
-
- BEGIN;
-
- GOTO start_here;
-
- WHILE bpa_route <> NIL DO
- BEGIN;
-
- (*-------------------------------------------------------------------*)
- (* Validate pointers *)
- (*-------------------------------------------------------------------*)
-
- {$IFDEF POINT_CHK}
- test_pointer(bpa_route);
- {$ENDIF}
-
- (*-------------------------------------------------------------------*)
- (* Make sure this is a valid and current route block. It might *)
- (* have disappeared because of a valid reason *)
- (*-------------------------------------------------------------------*)
-
- this_blk := msg_route_list;
-
- WHILE (this_blk <> NIL) AND (this_blk <> bpa_route^) DO
- BEGIN;
- {$IFDEF POINT_CHK}
- test_pointer(this_blk);
- {$ENDIF}
- this_blk := this_blk^.msg_r_next;
- END;
-
- (*-------------------------------------------------------------------*)
- (* If the route block still exists then reset it *)
- (*-------------------------------------------------------------------*)
-
- IF this_blk <> NIL THEN
- BEGIN;
- {$IFDEF POINT_CHK}
- test_pointer(this_blk);
- {$ENDIF}
- fwd_route_reset(this_blk);
- END;
-
- (*-------------------------------------------------------------------*)
- (* Free the memory control block *)
- (*-------------------------------------------------------------------*)
-
- free_task_mem(path_block_lst_id, FALSE);
-
- (*-------------------------------------------------------------------*)
- (* Find next/first block *)
- (*-------------------------------------------------------------------*)
-
- start_here:
-
- bpa_route := find_task_mem_addr(path_block_lst_id);
-
- END;
-
- END;
-
- (*===========================================================================*)
- (* Clean up routes that are empty only *)
- (*===========================================================================*)
-
- PROCEDURE fwd_route_clean_empty_route;
-
- VAR
- inx : BYTE;
- next_route : msg_r_ptr;
- this_msg : msg_index_ptr;
- last_route : msg_r_ptr;
- this_route : msg_r_ptr;
-
- BEGIN;
-
- (*-----------------------------------------------------------------------*)
- (* Initialize *)
- (*-----------------------------------------------------------------------*)
-
- last_route := NIL;
- next_route := msg_route_list;
-
- (*-----------------------------------------------------------------------*)
- (* Loop thru routes *)
- (*-----------------------------------------------------------------------*)
-
- WHILE next_route <> NIL DO
- BEGIN;
-
- {$IFDEF POINT_CHK}
- test_pointer(next_route);
- {$ENDIF}
-
- (*-------------------------------------------------------------------*)
- (* Set up chaining to next route *)
- (*-------------------------------------------------------------------*)
-
- this_route := next_route;
- next_route := this_route^.msg_r_next;
-
- (*-------------------------------------------------------------------*)
- (* Any messages queued? *)
- (*-------------------------------------------------------------------*)
-
- this_msg := find_next_msg(this_route, NIL, inx);
-
- (*-------------------------------------------------------------------*)
- (* If no messages queued then destroy the route else finish chaining *)
- (*-------------------------------------------------------------------*)
-
- IF this_msg = NIL THEN
- BEGIN;
- DISPOSE(this_route);
-
- {$IFDEF FREE_CHECK}
- test_free_list;
- {$ENDIF}
-
- IF last_route = NIL THEN
- msg_route_list := next_route
- ELSE
- last_route^.msg_r_next := next_route;
-
- END
- ELSE
- last_route := this_route;
-
- END; (*----- End of free route list loop ------------------------------*)
-
- END;
-
- (*===========================================================================*)
- (* Reset a message block back to the beginning *)
- (*===========================================================================*)
-
- PROCEDURE fwd_route_reset(this_blk : msg_r_ptr);
-
- VAR
- i : BYTE;
- j : BYTE;
-
- FUNCTION test_number(s : str4) : BOOLEAN;
-
- VAR
- code : INTEGER;
- i : INTEGER;
-
- BEGIN;
-
- test_number := FALSE;
- IF (LENGTH(s) > 3) OR (s = '') THEN EXIT;
-
- VAL(s, i, code);
-
- IF (code <> 0) OR (i < 0) THEN EXIT;
- test_number := TRUE;
-
- END;
-
- BEGIN;
-
- i := 1;
- j := this_blk^.msg_r_routes;
-
- WHILE (i < j) AND test_number(subword(@this_blk^.msg_r_info, i, 1)) DO
- INC(i);
-
- this_blk^.msg_r_nroute := i;
-
- END;
-
- END.